use crate::{
    editor::FileInfo,
    prelude::{CellIdx, LineIdx},
};

#[derive(Default, Eq, PartialEq, Debug)]
pub struct DocumentStatus {
    pub total_lines: usize,
    // 光标的行索引
    pub caret_line_idx: LineIdx,
    // 光标的列索引
    pub caret_cell_idx: CellIdx,
    pub is_modified: bool,
    pub file_info: FileInfo,
}

impl DocumentStatus {
    fn is_modified_to_string(&self) -> String {
        if self.is_modified {
            "(modified)".to_ascii_lowercase()
        } else {
            String::new()
        }
    }

    // 光标在终端网格中的位置转为字符串
    fn caret_position_to_string(&self) -> String {
        format!(
            "{}:{}",
            self.caret_line_idx.saturating_add(1),
            self.caret_cell_idx.saturating_add(1)
        )
    }

    // 文档状态字符串
    pub fn to_string(&self, status_bar_width: usize) -> String {
        // 理想显示效果：左 中 右

        // 左：文件名.后缀 - 总行数 lines (是否修改了文件)
        let left = format!(
            "{} - {} lines {}",
            self.file_info.get_file_name(),
            self.total_lines.to_string(),
            self.is_modified_to_string()
        );

        // 右：光标所在终端网格的“行:列” | 文件类型
        let right = format!(
            "{} | {}",
            self.caret_position_to_string(),
            self.file_info.get_file_type().to_string()
        );

        // 根据状态栏的宽度，在中间填充空白
        let middle_len = status_bar_width
            .saturating_sub(left.len())
            .saturating_sub(right.len());
        let middle = " ".repeat(middle_len);

        format!("{left}{middle}{right}")
    }
}
